[小ネタ] Terraform で Knowledge bases のデータソース作成時に初回同期をかける
こんにちは!AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。
Terraform で Amazon Bedrock Knowledge bases を作成する時、aws_bedrockagent_data_source
を利用すると思うのですが、初回の同期は Terraform でサポートされていません。(CloudFormation もサポートされていないようでした。)
そのため、以下のように手動で同期ボタンをクリックするわけですが、
何度、同期ボタンを押し忘れ、Sorry, I am unable to assist you with this request.
と怒られたことでしょうか。由々しき事態です。
(app-py3.12) takakuni.shinnosuke@HL01556 app % python main.py 桃太郎ってどこ中?
Sorry, I am unable to assist you with this request.
そこで今回は Terraform の local-exec を使って初回のデータソースを同期をしてみたいと思います。
最終的なコードは以下に格納されています。
terraform_data
terraform_data
のリソースは以下になりました。(結局シェル芸でしたね。)
StartIngestionJob API と GetIngestionJob API の 2 種類を利用しました。
resource "terraform_data" "datasource_sync" {
triggers_replace = [
aws_bedrockagent_data_source.oregon
]
provisioner "local-exec" {
command = <<EOT
INGESTION_JOB_ID=$(aws bedrock-agent start-ingestion-job --region ${local.oregon} \
--data-source-id ${aws_bedrockagent_data_source.oregon.data_source_id} \
--knowledge-base-id ${aws_bedrockagent_knowledge_base.oregon.id} \
--query ingestionJob.ingestionJobId --output text)
while true; do
export STATUS=$(aws bedrock-agent get-ingestion-job \
--region ${local.oregon} \
--knowledge-base-id ${aws_bedrockagent_knowledge_base.oregon.id} \
--data-source-id ${aws_bedrockagent_data_source.oregon.data_source_id} \
--ingestion-job-id $INGESTION_JOB_ID \
--query ingestionJob.status \
--output text)
if [ "$STATUS" = "COMPLETE" ]; then
echo "Ingestion job is complete."
break
elif [ "$STATUS" = "FAILED" ]; then
echo "Ingestion job failed."
exit 1
fi
sleep 10
done
EOT
}
}
工夫した点
StartIngestionJob のみを利用する場合、ジョブの実行結果を拾えないため GetIngestionJob も加えてみました。(一方通行でよければ StartIngestionJob のみで良いと思います。)
EventBridge Scheduler も StartIngestionJob のみの一方通行になるため、ステータスを確認したい場合は Step Functions を噛ませてあげるのが吉かと思います。
もっと工夫するなら
GetIngestionJob の Status は以下のどれかになるようです。必要に応じて分岐させるのも良いですね。
Valid Values: STARTING | IN_PROGRESS | COMPLETE | FAILED | STOPPING | STOPPED
結果を確認
無事同期できていますね。
ナレッジベースからも回答が返ってきています。めでたしめでたし。
(app-py3.12) takakuni@ app % python main.py 桃太郎ってどこ中?
桃太郎は日本の伝統的な昔話の主人公で、最初は桃の中から生まれた元気な子供として登場します。成長するにつれて、日本中で最も強い人物となり、鬼が島征伐を目指して旅に出ます。 彼は旅の途中で、犬を仲間にし、きびだんごを分け与えて一緒に鬼が島へ向かいます。桃太郎は非常に力が強く、近所の村中で誰も敵わないほどの力を持っていましたが、同時に優しい性格で、両親によく孝行をする子供でした。
まとめ
以上、「Terraform で Knowledge bases のデータソース作成時に初回同期をかける」でした。
初回同期を忘れないための非常に細かな tips ですが、参考になれば幸いです。
AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!